package string;

/**
 * JVM内部对字符串有一个优化措施：字符串常量池
 * JAVA推荐我们使用字面量形式创建字符串，并且会将使用字面量创建的字符串对象存入常量池缓存，当后期
 * 我们再使用该字面量创建新字符串时，JVM会直接重用常量池的对象，减少内存开销，避免内存中堆积大量
 * 内容一样的字符串对象
 */
public class StringDemo {
    public static void main(String[] args) {

        String s1="123abc";
        String s2="123abc";
        System.out.println(s1==s2);
        String s3="123abc";
        System.out.println(s1==s3);

        String s4=new String("123abc");
        System.out.println("s1:"+s1);
        System.out.println("s4:"+s4);
        System.out.println(s1=s4);

        System.out.println(s1.equals(s4));
        //字符串是不变对象，修改内容会创建新对象
        s1=s1+"!";//改变s1的内容时会创建新对象并把地址赋值给s1
        System.out.println("s1:"+s1);
        System.out.println("s2:"+s2);
        System.out.println("s3:"+s2);
        System.out.println(s1==s2);
        /*
        编译器在将源代码编译为字节码文件时，若发现某一个计算表达式可以在编译期间确定结果时
        就会进行计算，并将计算结果替换该表达式保存到字节码文件中
        下面代码会被编译器改为：
        String s5=“123abc”；
         */
        String s5="123"+"abc";
        System.out.println("s5:"+s5);
        System.out.println(s2==s5);
        /*
        当字符串拼接后产生的内容之前常量池中缓存的某个字符串内容一致时，也并不会重用常量池对象
         */
        String s="123";
        String s6=s+"abc";
        System.out.println("s6:"+s6);
        System.out.println(s2==s6);

    }
}
